/**
 *  Promise.all  的原理
 *
 *  Promise.all 返回的是一个有序数组. 即 是有序的.
 */
// require("fs").promises 是node新出的一个功能, 它可以让我们的 fs模块的功能都变成 promise
const fs = require("fs").promises
/**
 * @param promises 传入的是一个 可迭代的 数据
 */
// Promise.all = function (promises) {
//   return new Promise((resolve, reject) => {
//     // 将数组中的 promise 依次执行
//     let result = []
//     let index = 0;
//
//     function process(val, key) {
//       result[key] = val;
//       // 解决多个 异步并发问题, 只能靠计数器
//       if (++index == promises.length) {
//         return resolve(result)
//       }
//
//     }
//
//     for (let i = 0; i < promises.length; i++) {
//       let p = promises[i];
//       if (p && typeof p.then === "function") {
//         p.then((data) => {
//           // result[i] = data
//           process(data, i)
//         }, reject) // 如果有一个 promise失败了, 那么就执行这个 失败的逻辑
//       } else {
//         // result[i] = p
//         process(p, i)
//       }
//
//     }
//
//   })
// }

// Promise.all 返回的是一个有序的数组.
// Promise.all([fs.readFile("name.txt", "utf8"), fs.readFile("age.txt", "utf8")]).then((data) => {
//   console.log(data);
// })


// ============ Promise.finally 的实现 ================
/**
 * @param cb 接收一个回调
 */
Promise.prototype.finally = function (cb) {
  return this.then((y) => {
    return Promise.resolve(cb()).then((d) => y) // 返回上一次的结果
    // return y;
  }, (r) => {
    // cg执行,一旦报错 就直接跳过后续的then逻辑, 直接将错误向下传递
    return Promise.resolve(cb()).then(() => {
      throw r
    })
    // throw  r
  })
}
// finally是没有参数的. 它会把上一次的值原封不动的传递下去
// finally 如果返回的是一个 promise, 那么会有等待效果
Promise.resolve("ok").finally(() => {
  console.log("无论成功失败都执行");
}).then((data) => {
  // 成功的值 穿透到 成功的then方法
  console.log(data);
}).catch((err) => {
  console.log("失败");
})
